Function search path mutable

8/20/2025

์ฐธ๊ณ  :
https://supabase.com/docs/guides/database/database-advisors?queryGroups=lint&lint=0011_function_search_path_mutable

์›์ธ

In PostgreSQL, the search_path determines the order in which schemas are searched to find unqualified objects (like tables, functions, etc.)

search_path๋Š”ํ…Œ์ด๋ธ”๊ณผ ํ•จ์ˆ˜๊ฐ™์€ unqualified objects๋“ค์„ ์ฐพ์„๋•Œ ์–ด๋–ค ์Šคํ‚ค๋งˆ์—์„œ ์ฐพ์„์ง€ ์„ค์ •ํ•˜๋Š”๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋ณธ search_path๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๋•Œ ๋”ฐ๋กœ ์ž‘์„ฑํ•˜๋Š”๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

Search Path๋ž€?

profiles๋ผ๋Š” unqualified object(ํ…Œ์ด๋ธ”, ํ•จ์ˆ˜ ๋“ฑ)๊ฐ€ ์žˆ๊ณ  (public.profiles์ฒ˜๋Ÿผ ์•ž์— ์Šคํ‚ค๋งˆ์˜ ์ด๋ฆ„๊นŒ์ง€ ์ž‘์„ฑํ•˜๋ฉด qualified object๊ฐ€ ๋œ๋‹ค.) ์ด๊ฑธ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์Šคํ‚ค๋งˆ์˜ ์ด๋ฆ„๋“ค์ด ์ ํžŒ ๋ฆฌ์ŠคํŠธ๊ฐ€ search_path๋‹ค.
๊ธฐ๋ณธ์ ์œผ๋กœ search_path๋Š” ์‚ฌ์šฉ์ž์˜ ์Šคํ‚ค๋งˆ์™€ public ์Šคํ‚ค๋งˆ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋งŒ์ผ์˜ ๊ฒฝ์šฐ์— ๋Œ€๋น„ํ•ด search_path๋ฅผ ํŠน์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข‹๋‹ค๊ณ  ํ•˜๋Š”๋ฐ, ์™œ๋ƒํ•˜๋ฉด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
์˜ˆ๋ฅผ๋“ค์–ด ์–ด๋–ค ํ•จ์ˆ˜ example_function()์—์„œ profiles ํ…Œ์ด๋ธ”์—์„œ ์ž๋ฃŒ๋ฅผ ๊ฐ€์ ธ์™€ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ search_path๊ฐ€ ํŠน์ •๋˜์–ด์žˆ์ง€ ์•Š์•˜๋‹ค๊ณ  ํ•œ๋‹ค๋ฉด, sales์Šคํ‚ค๋งˆ์— ์†ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ์™€ develpoment์Šคํ‚ค๋งˆ์— ์†ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ๋•Œ example_function()์€ ๊ฐ๊ฐ ์‚ฌ์šฉ์ž๋“ค์ด ์†ํ•œ ์Šคํ‚ค๋งˆ์˜ profilesํ…Œ์ด๋ธ”์„ ์ฐธ๊ณ ํ•˜๊ฒŒ ๋œ๋‹ค.(๋‘ ์Šคํ‚ค๋งˆ ๋ชจ๋‘ profiles๋ผ๋Š” ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด)

ํ•ด๊ฒฐ

ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๋•Œ DDL์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

create or replace function example_function()
	returns void
	language sql
	set search_path = '' -- ์—ฌ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.
as $$
	....
$$;

๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๊ธฐ

์ŠˆํŒŒ๋ฒ ์ด์Šค๋Š” ํŠนํžˆ search_path = ''๋กœ ์„ค์ •ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
๋นˆ ๋ฌธ์ž์—ด๋กœ ์„ค์ •ํ•˜๋ฉด search_path๋ฅผ ์‚ฌ์‹ค์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๊ณ ,
ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์–ด๋–ค ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•  ๋•Œ unqualified์ธ ์ƒํƒœ๋กœ ์ฐธ์กฐํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋ฐ˜๋“œ์‹œ ์Šคํ‚ค๋งˆ ๋ช…์„ ๋ช…์‹œํ•œ qualified ์ƒํƒœ(schema.object)๋กœ ์ฐธ์กฐํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ‚ค๋งˆ ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์•ผํ•œ๋‹ค.
์Šคํ‚ค๋งˆ๋ช…์„ ๋ช…์‹œํ•ด์•ผ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ†ตํ•ด ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋™์ž‘undexpected behavior์„ ๋ฐฉ์ง€ํ•˜๊ณ , ๋ณด์•ˆ ์ทจ์•ฝ์„ฑsecurity vulnerabilities์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ถŒ์žฅํ•œ๋‹ค๊ณ .
๋ช…ํ™•์„ฑ, ์ผ๊ด€์„ฑ, ๋ณด์•ˆ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ์–ด์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•œ ๋ฐฉ๋ฒ•.